package bancosys.tec.datadigester.fileregistry.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import jmine.tec.persist.annotation.Alias;
import jmine.tec.persist.annotation.Constraint;
import bancosys.tec.component.Documentation;
import bancosys.tec.datadigester.fileregistry.domain.enumx.Frequency;
import bancosys.tec.persist.bussobj.PersistableBusinessObject;
import bancosys.tec.persist.persister.annotation.NaturalKey;
import bancosys.tec.persist.persister.annotation.Unique;

/**
 * Cont√©m um registro de um arquivo de cota√ß√£o e suas informa√ß√µes de driver, processor e periodicidade de importa√ß√£o.
 * 
 * @author piercio
 */
@Entity
@Table(name = "FILE_REGISTRY")
@Alias("FILERG")
@SequenceGenerator(name = "SEQ_FILERG", sequenceName = "SEQ_FILERG")
@Documentation("REPRESENTA UM ARQUIVO QUE PODE SER IMPORTADO PELA APLICACAO, COM SEUS DADOS DE DRIVER, PROCESSOR E FREQUENCIA.")
public class FileRegistry extends PersistableBusinessObject {

    private static final long serialVersionUID = 5511656219731755802L;

    private Long id;

    private String fileCode;

    private String driverClass;

    private String processorId;

    private Frequency frequency;

    private Integer monthDay;

    /**
     * @return o valor do campo id
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_FILERG")
    @Column(name = "COD_FILE_REG", nullable = false)
    @Documentation("CODIGO SEQUENCIAL DA TABELA.")
    public Long getId() {
        return this.id;
    }

    /**
     * @param id o valor para o campo id
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * Retorna o c√≥digo do arquivo.
     * 
     * @return o valor do campo fileCode
     */
    @Unique
    @NaturalKey
    @Column(name = "FILE_CODE", nullable = false)
    @Documentation("CODIGO DO ARQUIVO PARA IMPORTACAO.")
    public String getFileCode() {
        return this.fileCode;
    }

    /**
     * @param fileCode o valor para o campo fileCode
     */
    public void setFileCode(String fileCode) {
        this.fileCode = fileCode;
    }

    /**
     * Devolve a classe do driver (qualified name) que efetua o parse desse arquivo.
     * 
     * @return o valor do campo driverClass
     */
    @Column(name = "DRIVER_CLASS", nullable = false)
    @Documentation("NOME COMPLETO DA CLASSE DO DRIVER QUE EFETUA O PARSE DESSE ARQUIVO.")
    public String getDriverClass() {
        return this.driverClass;
    }

    /**
     * @param driverClass o valor para o campo driverClass
     */
    public void setDriverClass(String driverClass) {
        this.driverClass = driverClass;
    }

    /**
     * Devolve o id do bean de processor para esse arquivo, como cadastrado no Spring.
     * 
     * @return o valor do campo processorId
     */
    @Column(name = "PROCESSOR_ID", nullable = false)
    @Documentation("IDENTIFICADOR (ID) DO BEAN QUE REPRESENTA O PROCESSOR PARA ESSE ARQUIVO, COMO ESPECIFICADO NO SPRING.")
    public String getProcessorId() {
        return this.processorId;
    }

    /**
     * @param processorId o valor para o campo processorId
     */
    public void setProcessorId(String processorId) {
        this.processorId = processorId;
    }

    /**
     * Devolve a data a ser usada para virada de mes, quando a frequencia for mensal.
     * 
     * @return o valor do campo monthDay
     */
    @Column(name = "MONTH_DAY", nullable = true)
    @Documentation("DIA DO MES QUE INDICA O INICIO DO CICLO PARA FREQUENCIAS MENSAIS.")
    public Integer getMonthDay() {
        return this.monthDay;
    }

    /**
     * @param monthDay o valor para o campo monthDay
     */
    public void setMonthDay(Integer monthDay) {
        this.monthDay = monthDay;
    }

    /**
     * @return o valor do campo frequency
     */
    @Column(name = "FREQUENCY", nullable = false)
    @Documentation("PERIODICIDADE COM QUE O ARQUIVO DEVE SER IMPORTADO.")
    @Constraint(suffix = "0")
    public Frequency getFrequency() {
        return this.frequency;
    }

    /**
     * @param frequency o valor para o campo frequency
     */
    public void setFrequency(Frequency frequency) {
        this.frequency = frequency;
    }

}
